package com.example.tomatotodo;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.tomatotodo.api.ApiClient;
import com.example.tomatotodo.api.ApiService;
import com.example.tomatotodo.entity.ResultUser;
import com.example.tomatotodo.entity.User;
import com.example.tomatotodo.model.LoginDTO;
import com.example.tomatotodo.model.Result;
import com.example.tomatotodo.util.MD5Utils;
import com.example.tomatotodo.util.TokenManager;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginFragment extends Fragment {
    private static final String TAG = "LoginFragment";
    private static final String PREFS_CREDENTIALS = "login_credentials"; // 存储账号密码的SharedPreferences
    private static final String KEY_PHONE = "saved_phone";
    private static final String KEY_PASSWORD = "saved_password";
    private EditText etUsername;
    private EditText etPassword;
    private Button btnLogin;
    private CheckBox cbRemember;
    private TextView tvSkip;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_login, container, false);
        // 获取输入框和按钮
        etUsername = view.findViewById(R.id.input_login_name);
        etPassword = view.findViewById(R.id.input_login_pwd);
        btnLogin = view.findViewById(R.id.btn_login);
        cbRemember = view.findViewById(R.id.login_remember);
        tvSkip = view.findViewById(R.id.skip_login);

        // 新增：获取"注册"按钮（位于 login_title 布局中）
        View loginTitleLayout = view.findViewById(R.id.login_title); // 获取 include 的标题栏布局
        TextView tvSignIn = loginTitleLayout.findViewById(R.id.sign_in); // 从标题栏布局中获取注册按钮

        // 加载已保存的账号密码（记住密码功能）
        loadSavedCredentials();

        // 登录按钮点击事件
        btnLogin.setOnClickListener(v -> attemptLogin());

        // 跳过按钮点击事件
        tvSkip.setOnClickListener(v -> {
            Intent intent = new Intent(getActivity(), MainActivity.class);
            startActivity(intent);
            requireActivity().finish(); // 关闭登录页，避免返回
        });

        // 新增：注册按钮点击事件（跳转到注册页面）
        tvSignIn.setOnClickListener(v -> {
            Intent intent = new Intent(getActivity(), RegisterActivity.class); // 假设注册页为 RegisterActivity
            startActivity(intent);
            requireActivity().finish(); // 关闭当前登录页，避免返回
        });
        return view;
    }

    /**
     * 尝试登录流程
     */
    private void attemptLogin() {
        // 1. 获取表单输入值
        String phone = etUsername.getText().toString().trim(); // 手机号（对应 LoginDTO 的 phone 字段）
        String password = etPassword.getText().toString().trim(); // 密码（对应 LoginDTO 的 password 字段）

        // 手机号验证：非空 + 11位
        if (TextUtils.isEmpty(phone)) {
            etUsername.setError("请输入手机号");
            etUsername.requestFocus();
            return;
        }
        if (phone.length() != 11) { // 新增：手机号必须为11位
            etUsername.setError("请输入11位手机号");
            etUsername.requestFocus();
            return;
        }

        // 密码验证：非空 + 至少6位
        if (TextUtils.isEmpty(password)) {
            etPassword.setError("请输入密码");
            etPassword.requestFocus();
            return;
        }
        if (password.length() < 6) { // 新增：密码至少6位
            etPassword.setError("密码至少6位");
            etPassword.requestFocus();
            return;
        }

        String encryptedPassword = MD5Utils.md5(password);

        // 3. 构建登录请求DTO（使用加密后的密码）
        LoginDTO loginDTO = new LoginDTO();
        loginDTO.setPhone(phone);
        loginDTO.setPassword(encryptedPassword);

        // 4. 调用登录接口
        ApiService apiService = ApiClient.getClient().create(ApiService.class);
        Call<Result<String>> call = apiService.login(loginDTO); // 调用 ApiService 中的 login 接口

        call.enqueue(new Callback<Result<String>>() { // 异步请求回调@Override
            public void onResponse(Call<Result<String>> call, Response<Result<String>> response) {
                if (response.isSuccessful() && response.body() != null) {
                    Result<String> result = response.body();
                    if (result.getCode() == 200 && result.getData() != null) {
                        // 登录成功：保存Token + 显示成功提示
                        String token = result.getData(); // 后端返回格式为 "Bearer {token}"
                        TokenManager.saveToken(getActivity(), token);
                        Toast.makeText(getActivity(), "登录成功！", Toast.LENGTH_SHORT).show(); // 登录成功提示
                        // 新增：获取用户信息
                        getUserProfile(token);

                        // 根据CheckBox状态保存/清除账号密码（记住密码功能）
                        if (cbRemember.isChecked()) {
                            saveCredentials(phone, password); // 保存账号密码
                        } else {
                            clearCredentials(); // 清除已保存的账号密码
                        }

                        // 跳转主界面
                        Intent intent = new Intent(getActivity(), MainActivity.class);
                        startActivity(intent);
                        requireActivity().finish(); // 关闭登录页，避免返回
                    } else {
                        // 登录失败：显示后端返回的错误信息 (如"手机号或密码错误")
                        Toast.makeText(getActivity(), "登录失败: " + result.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                } else {
                    // 接口调用失败（如网络错误、服务器异常）
                    Toast.makeText(getActivity(), "登录失败: 网络异常", Toast.LENGTH_SHORT).show();
                    Log.e(TAG, "Login failed, response code: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<Result<String>> call, Throwable t) {
                // 网络请求失败（如无网络、连接超时）
                Toast.makeText(getActivity(), "登录失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
                Log.e(TAG, "Login error: " + t.getMessage());
            }
        });
    }

    // 新增：获取用户信息
    private void getUserProfile(String token) {
        ApiService apiService = ApiClient.getClient().create(ApiService.class);
        Call<ResultUser> call = apiService.getProfile(token);

        call.enqueue(new Callback<ResultUser>() {
            @Override
            public void onResponse(Call<ResultUser> call, Response<ResultUser> response) {
                if (response.isSuccessful() && response.body() != null) {
                    ResultUser resultUser = response.body();
                    if (resultUser.getCode() == 200 && resultUser.getData() != null) {
                        // 保存用户信息到SharedPreferences
                        User user = resultUser.getData();
                        SharedPreferences prefs = getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);
                        prefs.edit()
                                .putString("username", user.getUsername())
                                .putString("phone", user.getPhone())
                                .putLong("user_id", user.getId())
                                .apply();

                        // 新增：获取用户头像（使用用户ID作为参数）
                        fetchUserAvatar(user.getId());
                    }
                }
            }

            @Override
            public void onFailure(Call<ResultUser> call, Throwable t) {
                Log.e(TAG, "获取用户信息失败: " + t.getMessage());
            }
        });
    }

    // 新增：获取用户头像
    // 新增：获取用户头像（修复：添加Token请求头）
    private void fetchUserAvatar(long userId) {
        ApiService apiService = ApiClient.getClient().create(ApiService.class);

        // 获取Token（修复：添加Token请求头，与ProfileFragment保持一致）
        String token = TokenManager.getToken(getActivity());
        if (token == null) {
            Log.e(TAG, "获取头像失败：Token为空");
            return;
        }

        Call<ResponseBody> call = apiService.getAvatar("Bearer " + token, userId); // 携带Token

        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                if (response.isSuccessful() && response.body() != null) {
                    Log.d(TAG, "用户头像获取成功，用户ID: " + userId);
                    try {
                        byte[] avatarBytes = response.body().bytes();

                        // 新增：检查头像数据是否为空（核心修复）
                        if (avatarBytes.length == 0) {
                            Log.e(TAG, "头像数据为空，清除本地头像路径");
                            // 清除SharedPreferences中的头像路径，触发默认头像显示
                            SharedPreferences prefs = getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);
                            prefs.edit().remove("avatar_path").apply();
                            return; // 终止保存流程
                        }

                        saveAvatarToLocal(avatarBytes, userId); // 数据有效时才保存
                    } catch (IOException e) {
                        Log.e(TAG, "头像数据读取失败: " + e.getMessage());
                    }
                } else {
                    Log.e(TAG, "用户头像获取失败，响应码: " + response.code() + "，用户ID: " + userId);
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.e(TAG, "用户头像获取网络错误: " + t.getMessage() + "，用户ID: " + userId);
            }
        });
    }
    // 新增: 保存头像到本地存储并记录路径
    private void saveAvatarToLocal(byte[] avatarBytes, long userId) {
        if (getActivity() == null) return;

        // 1. 创建本地文件（应用内部存储，其他应用无法访问）
        File avatarFile = new File(getActivity().getFilesDir(), "avatar_" + userId + ".jpg");
        try (FileOutputStream fos = new FileOutputStream(avatarFile)) { // 使用 try-with-resources 自动关闭流
            // 2. 写入头像数据到文件
            fos.write(avatarBytes);
            // fos.close() 无需手动调用，try-with-resources 会自动处理
            Log.d(TAG, "头像保存成功，路径: " + avatarFile.getAbsolutePath());

            // 3. 记录文件路径到SharedPreferences（供ProfileFragment读取）
            SharedPreferences prefs = getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);
            prefs.edit()
                    .putString("avatar_path", avatarFile.getAbsolutePath()) // 保存头像路径
                    .apply();
        } catch (IOException e) {
            Log.e(TAG, "头像保存失败: " + e.getMessage(), e);
        }
    }

    /**
     * 获取用户信息
     */
    private void saveCredentials(String phone, String password) {
        SharedPreferences prefs = getActivity().getSharedPreferences(PREFS_CREDENTIALS, getActivity().MODE_PRIVATE);
        prefs.edit()
                .putString(KEY_PHONE, phone)
                .putString(KEY_PASSWORD, password)
                .apply();
    }

    /**
     * 从SharedPreferences加载账号密码
     */
    private void loadSavedCredentials() {
        SharedPreferences prefs = getActivity().getSharedPreferences(PREFS_CREDENTIALS, getActivity().MODE_PRIVATE);
        String savedPhone = prefs.getString(KEY_PHONE, null);
        String savedPassword = prefs.getString(KEY_PASSWORD, null);

        if (savedPhone != null && savedPassword != null) {
            etUsername.setText(savedPhone); // 填充账号
            etPassword.setText(savedPassword); // 填充密码
            cbRemember.setChecked(true); // 勾选CheckBox
        }
    }

    /**
     * 清除已保存的账号密码
     */
    private void clearCredentials() {
        SharedPreferences prefs = getActivity().getSharedPreferences(PREFS_CREDENTIALS, getActivity().MODE_PRIVATE);
        prefs.edit().clear().apply();
    }
}